package com.richpay.basejava.base14;

/**
 * 选择排序的原理(以从小到大排为例):
 * 索引为0的应该放最小的元素，如何放呢？
 * 将索引为0的值拿出来与后面的每一个值进行比较，如果比后面的值大则互换，否则不变。
 * 然后将索引为1的值与后面的每一个值进行比较，依次类推。
 *
 */
public class SelectSort {
    public static void main(String[] args) {
        int[] intArray = {15, 23, 8, 10, 7};
        System.out.println("原始数组:");
        print(intArray);

        selectSort(intArray);
        System.out.println("排序后的数组:");
        print(intArray);

    }

    /**
     * @param array 传入一个数组，依次打印数组元素的值
     */
    static void print(int[] array) {
        for (int i : array) {
            System.out.print(i + " ");
        }
        System.out.println();//换行

    }

    /**
     * 进行选择排序
     *
     * 15  23  8  10  7
     * ================ 第一轮
     *
     * 第一次比较:15和23，位置不变。
     * 15  23  8  10  7
     * 第二次比较:15和 8，位置互换。
     * 8   23  15 10  7
     * 第三次比较: 8和10,位置不变。
     * 8   23  15 10  7
     * 第四次比较: 8和 7,位置互换。
     * 7   23  15 10  8
     * ================= 第二轮
     *
     * 第一次比较:23和15,位置互换。
     * 7   15  23 10  8
     * 第二次比较:15和10,位置互换。
     * 7   10  23 15  8
     * 第三次比较:10和 8,位置互换。
     * 7   8   23 15  10
     * ================= 第三轮
     *
     * 第一次比较:23和15,位置互换。
     * 7   8   15 23  10
     * 第二次比较:15和10,位置互换。
     * 7   8   10 23  15
     * ================= 第四轮
     *
     * 第一次比较:23和15,位置互换。
     * 7   8   10 15  23
     *
     *
     * @param array
     */
    static void selectSort(int[] array) {
        int len = array.length;//获取数组中元素的个数
        for (int i = 0; i < len; i++) {//外层循环控制比较的趟数
            for (int j = i + 1; j < len; j++) {
                if (array[i] > array[j]) {
                    swap(array, i, j);
                }
            }
        }
    }

    static void swap(int[] array, int i, int j) {
        int temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }

}
